package com.sugon.atomic;

/**
 * @author LUOYUAN
 * @date 2019-01-29-10:46
 */
public class AtomicInteger {

    static int i = 0;
    static Integer a = Integer.valueOf(0);
    static java.util.concurrent.atomic.AtomicInteger b = new java.util.concurrent.atomic.AtomicInteger(0);
    public static void main(String[] args) throws Exception{
        Thread[] ts = new Thread[10];
        for (int j = 0; j < ts.length; j++) {
            ts[j] = new Thread(new Runnable() {
                @Override
                public void run() {
                    for (int j = 1; j <=10000; j++) {
                        //里面有原子操作，i存在在一个局部变量里面，首先把i取出来放在一个寄存器里面
                        //在寄存器里面+1，在cpu里面计算，计算完之后在写回到变量里面
                        //这就是++i 比 i++快的原因，  ++i不需要寄存器
                        i++;

                        //加锁解决不了问题，对象没有锁上，原因锁不住a.intValue()，a.intValue()+1其实还是整数操作
                        synchronized (a) {
                            a = Integer.valueOf(a.intValue() + 1);
                        }
                        b.incrementAndGet(); //相当于++a
                    }
                }
            });
            ts[j].start();
        }
        for (int j = 0; j < ts.length; j++) {
            ts[j].join();
        }
        System.out.println(i);
        System.out.println(a);
        System.out.println(b);
    }
}
